package org.tri.entity;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;

/**
 * La clase {@code CompraHistorica} almacena los datos pertinentes
 * de una compra (animales, fecha, etc) considerada como histórica,
 * dad su antigüedad y relevancia para el negocio.
 * @author kiira
 * @version 1.0, Nov 23, 2011
 */
@Entity
@Table ( name = "compra_hist" )
public class CompraHistorica extends AbstractCompra {

    /** Lista de animales asociados a la compra. */
    private List<AnimalHistorico> animalesHistoricos;

    /**
     * Devuelve los animales que fueron adquiridos en esta compra.
     * @return lista de animales de la compra.
     */
    @OneToMany ( cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH },
                 mappedBy = "compraHistorica" )
    @Cascade ( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
                 org.hibernate.annotations.CascadeType.EVICT } )
    public List<AnimalHistorico> getAnimalesHistoricos() {
        return animalesHistoricos;

    }//end método getAnimalesHistoricos

    /**
     * Setea los animales de la compra.
     * Este método es utilizado exclusivamente para asignar los
     * animales recuperados desde la base de datos.
     * @param animalesHistoricos lista de animales de la compra.
     */
    protected void setAnimalesHistoricos( List<AnimalHistorico> animalesHistoricos ) {
        this.animalesHistoricos = animalesHistoricos;

    }//end método setAnimalesHistoricos

    @Override
    public List<AbstractAnimal> obtenerAnimales() {
        List<AbstractAnimal> anim = new ArrayList<AbstractAnimal>();
        
        anim.addAll( getAnimalesHistoricos() );
        
        return anim;
        
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public void agregarAnimal(String animal) {
        throw new IllegalStateException("No se puede asociar un animal a una"
                                        + " compra historica");
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void agregarAnimales(List<String> animales) {
        throw new IllegalStateException("No se puede asociar animales a una"
                                        + " compra historica");
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void eliminarAnimal(Animal animal) {
        throw new IllegalStateException("No se puede desligar animales de una"
                                        + " compra historica");
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void eliminarAnimales(List<Animal> animales) {
        throw new IllegalStateException("No se puede desligar animales de una"
                                        + " compra historica");
    }

}//end clase CompraHistorica

